package lambda.demo01;

import org.junit.Test;

import java.util.Random;
import java.util.stream.IntStream;

public class IntStreamTest {
    @Test
    public void test() throws Exception {
        //包含指定的元素
//        IntStream intStream=IntStream.of(1);
        //返回的int流中的元素是已经排序好的
        IntStream intStream = IntStream.of(1, 3, 2, 5, 4, 6);
        print("of", intStream);

        //从11到16,不包含16
        intStream = IntStream.range(11, 16);
        //从11到16,包含16
//        intStream=IntStream.rangeClosed(11,16);
        print("range", intStream);

        //包含指定的元素,add方法底层也是调用accept方法，然后返回this
        //返回的int流中的元素顺序与添加顺序一致
        intStream = IntStream.builder().add(23).add(22).add(21).build();
        print("builder", intStream);

        //指定一个int生成函数
        //返回的int流中的元素不排序
        intStream = IntStream.generate(() -> {
            Random random = new Random();
            return random.nextInt(100);
        }).limit(6);
        print("generate", intStream);

        //指定一个int生成函数，前一次执行函数的结果会作为下一次调用函数的入参
        //第一个参数seed就是第一次调用生成函数的入参
        //返回的int流中的元素不排序
        intStream = IntStream.iterate(1, x -> {
            int a = 2 * x;
            if (a > 16) {
                return a - 20;
            } else {
                return a;
            }
        }).limit(6);
        print("iterate", intStream);
    }

    @Test
    public void test2() throws Exception {
        IntStream streamA = IntStream.range(11, 15);
        IntStream streamB = IntStream.range(6, 10);
        //将两个IntStream 合并起来
        //返回的int流的元素顺序与添加的流的元素顺序一致，不排序
        IntStream streamC = IntStream.concat(streamA, streamB);
        print("concat", streamC);
    }

    private void print(String start, IntStream intStream) {
        System.out.println("print for->" + start);
        intStream.forEach(x -> {
            System.out.println(x);
        });
    }
}
